const path = require('path');
// 按照原始目录打包
const TranspilePlugin = require('transpile-webpack-plugin');
// 保留注释插件
// const TerserPlugin = require('terser-webpack-plugin');
// 代码混淆
const WebpackObfuscator = require('webpack-obfuscator');
module.exports = {
  mode: 'production',
  entry: './index.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    // filename: './index.min.js',
    // library: 'Taishan',
    libraryTarget: 'umd',
    globalObject: 'this'
  },

  resolve: {
    alias: {
      '@': path.resolve(__dirname, './libs') // 别名设置
    }
  },
  plugins: [
    new TranspilePlugin(),
    new WebpackObfuscator(
      {
        obfuscationLevel: 'medium', // 混淆级别（可选值：'paranoid', 'aggressive', 'medium', 'easy' 或 'off'）
        compact: true,
        rotateUnicodeArray: true, // 启用Unicode旋转
        identifierNamesGenerator: 'mangled', // 'hexadecimal',
        renameGlobals: true,
        rotateStringArray: true, //通过固定和随机（在代码混淆时生成）的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小，建议使用此选项，因为辅助函数可以引起注意。
        selfDefending: true, //混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
        stringArray: true, //删除字符串文字并将它们放在一个特殊的数组中
        stringArrayEncoding: ['base64'], //'rc4',
        // TODO： 加上stringArrayThreshold，steam_limit生成的代码没生效
        // stringArrayThreshold: 1,
        transformObjectKeys: true,
        unicodeEscapeSequence: false //允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小，并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
      },
      // 数组内是需要排除的文件
      []
    )
  ]

  // 保留注释
  // optimization: {
  //   minimize: true,
  //   minimizer: [
  //     new TerserPlugin({
  //       terserOptions: {
  //         compress: false,
  //         output: {
  //           comments: /@/i
  //         }
  //       },
  //       extractComments: false // 关闭单独提取注释到一个文件
  //     })
  //   ]
  // }
};
